import App from '../../../base'
import { react2angular } from 'react2angular'
import { cloneDeep } from 'lodash'

import FileTreeRoot from '../components/file-tree-root'
import { rootContext } from '../../../shared/context/root-context'

App.controller('ReactFileTreeController', function (
  $scope,
  $timeout,
  ide
  // eventTracking
) {
  $scope.projectId = ide.project_id
  $scope.rootFolder = null
  $scope.rootDocId = null
  $scope.hasWritePermissions = false
  $scope.isConnected = true

  $scope.$on('project:joined', () => {
    $scope.rootFolder = $scope.project.rootFolder
    $scope.rootDocId = $scope.project.rootDoc_id
    $scope.$emit('file-tree:initialized')
  })

  $scope.$watch('permissions.write', hasWritePermissions => {
    $scope.hasWritePermissions = hasWritePermissions
  })

  $scope.$watch('editor.open_doc_id', openDocId => {
    window.dispatchEvent(
      new CustomEvent('editor.openDoc', { detail: openDocId })
    )
  })

  // Set isConnected to true if:
  // - connection state is 'ready', OR
  // - connection state is 'waitingCountdown' and reconnection_countdown is null
  // The added complexity is needed  because in Firefox on page reload the
  // connection state goes into 'waitingCountdown' before being hidden and we
  // don't want to show a disconnect UI.
  function updateIsConnected() {
    const isReady = $scope.connection.state === 'ready'
    const willStartCountdown =
      $scope.connection.state === 'waitingCountdown' &&
      $scope.connection.reconnection_countdown === null
    $scope.isConnected = isReady || willStartCountdown
  }

  $scope.$watch('connection.state', updateIsConnected)
  $scope.$watch('connection.reconnection_countdown', updateIsConnected)

  $scope.onInit = () => {
    // HACK: resize the vertical pane on init after a 0ms timeout. We do not
    // understand why this is necessary but without this the resized handle is
    // stuck at the bottom. The vertical resize will soon be migrated to React
    // so we accept to live with this hack for now.
    $timeout(() => {
      $scope.$emit('left-pane-resize-all')
    })
  }

  $scope.onSelect = selectedEntities => {
    if (selectedEntities.length === 1) {
      const selectedEntity = selectedEntities[0]
      const type =
        selectedEntity.type === 'fileRef' ? 'file' : selectedEntity.type
      $scope.$emit('entity:selected', {
        ...selectedEntity.entity,
        id: selectedEntity.entity._id,
        type,
      })

      // in the react implementation there is no such concept as "1
      // multi-selected entity" so here we pass a count of 0
      $scope.$emit('entities:multiSelected', { count: 0 })
    } else if (selectedEntities.length > 1) {
      $scope.$emit('entities:multiSelected', {
        count: selectedEntities.length,
      })
    } else {
      $scope.$emit('entity:no-selection')
    }
  }

  $scope.userHasFeature = feature => ide.$scope.user.features[feature]

  $scope.$watch('permissions.write', hasWritePermissions => {
    $scope.hasWritePermissions = hasWritePermissions
  })

  $scope.refProviders = ide.$scope.user.refProviders || {}

  ide.$scope.$watch(
    'user.refProviders',
    refProviders => {
      $scope.refProviders = cloneDeep(refProviders)
    },
    true
  )

  $scope.setRefProviderEnabled = provider => {
    ide.$scope.$applyAsync(() => {
      ide.$scope.user.refProviders[provider] = true
    })
  }

  $scope.setStartedFreeTrial = started => {
    $scope.$applyAsync(() => {
      $scope.startedFreeTrial = started
    })
  }

  $scope.reindexReferences = () => {
    ide.$scope.$emit('references:should-reindex', {})
  }
})

App.component(
  'fileTreeRoot',
  react2angular(
    rootContext.use(FileTreeRoot),
    Object.keys(FileTreeRoot.propTypes)
  )
)
